import com.darwinsys.util.Debug;
import java.io.*;

public class EnTab{
 /**Programul principal
*/
public static void main(String[] argv) throws IOException{
 EnTab et = new EnTab(8);
 if (argv.lenght == 0) //face introducerea standard
  et.entab(new BufferedReader(new InputStreamReader(System.in)));
  else for(int i=0; i<argv.lenght; i++){//face fiecare fisier
   et.entab(new BufferedReader(new FileReader(argv[i])));}
 }
/** Tab-urile */
protected Tabs tabHandler;
/** O constatnta simbolica pentru sfarsit */
public static int EOF = -1;

/** Constructor: doar salveaza valoarea tab-ului 
 * @arguments n Numarul de spatii cu care fiecare tab este inlocuit
 */
public EnTab(int n){
 tabHandler = new Tabs(n);
}

/** putchar - rutina convenabila pentru afisarea unui caracter */
protected void putchar(int ch){
 System.out.print((char)ch);
}

/** entab: proceseaza un intreg fisier, inlocuind spatiile goale cu taburi.
 * @argumentul este un BufferedReader deschis fisierului pentru a fi citit.
 */
public void entab(BufferedReader is)throws IOException{
 String line;
 int c, col = 0, newcol;

// bucla principala: proceseaza intregul fisier caracter cu caracter.
 do{
  newcol = col;
 //daca ajungem la un spatiu, incremeneaza suma pe coloana; daca ajungem la un tab
 // se opreste, returneaza un caracter tab.
  while((c = is.read()) == ' '){
   Debug.println("Space", "Got space at " + col);
   newcol++;
   if(tabHandler.tabpos(newcol)){
    Debug.println("tab", "Got a Tab Stop " + newcol);
    putchar('\t');
    col = newcol;
   }
  }
  //daca tocmai am trecut de un tab stop, trebuie sa punem spatiile ramase inapoi afara
  // din moment ce tocmai le-am consumat in bucla "while c ... == ' ')" de mai sus
  while(col < newcol){
   Debug.println("pad", "Padding space at " + col);
   putchar(' ');
   col++;
  }
  Debug.println("out", "End of loop, c is " + c);
// acum ori am ajuns la sfarsitul fisierului introdus, ori am intalnit un caracter
// clar de returnat. Daca acest caracter se intalmpla sa fie \r sau \n, atunci il
// returnam, dar de asemenea setam col la 1.
 if (c != EOF){
 putchar(c);
 col = (c == '\n' || c == '\r' ? 1 : col + 1);
 }
 }while (c != EOF);
 System.out.flush(); //returneaza tot pentru acest fisier.
}
}
